#include "DynamicArray.h"
#include <stdlib.h>
#include <stdio.h>
#define true 1
#define false 0

int ArrayInit(DMArray *array)       // 数组初始化
{
    array->dp = (ElementType *)malloc(array->size * sizeof(ElementType));           // 申请堆上的空间 size   数据类型的大小
    if (array->dp == NULL)      //是否申请成功的判断
    {
        printf("Init malloc Error!\n");
        return false;
    }
    return true;
}

void FreeArray(DMArray *array)
{
    if (array->dp != NULL)      //判断指针不为空，因为释放空指针会出错
    {
        free(array->dp);
        array->dp = NULL;       //放空之后指针要置为空
    }
}

int ReallocArray(DMArray *array)        //扩容动态数组
{
    ElementType *temp = array->dp;      //保存原先内存的备份指针
    array->dp = (ElementType *)malloc(sizeof(ElementType) * array->size * 2);       //给dp指针申请一块新的内存，大小为数据类型★原先的空间个数* 2
    if (array->dp == NULL)      //判断申请是否成功
    {
        printf("ReallocArray Error!\n");        //申请失败之后打印错误信息，返回false
        return false;
    }
    for (int i = 0; i < array->len; i++)        //遍历原先的数组内存，将每一个元素都拷贝到新内存中
    {
        array->dp[i] = temp[i];
    }
    array->size *= 2;       //空间扩展到原先的2倍
    free(temp);             //释放掉了原先的内存空间
    return true;
}

int InsertArray(DMArray *array, ElementType element)
{
    if (array->len == array->size)          //数组己满
    {
        if (ReallocArray(array) == false)       //判断扩容是否失败
        {
            printf("can not contain more elements!\n");     //扩容失败打印错误信息，返回false
            return false;
        }
    }

    array->dp[array->len] = element;       //扩容成功或者数组没满，在数组的第len个位置附上我们的元素的值 
    array->len++;       //计算数组长度的计数器加1
    return true;
}


